package net.freebytes.reactor.demo;

import java.time.Duration;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import reactor.core.scheduler.Schedulers;

public class ReactorDemo {

    public static void main(String[] args) {
        // 创建一个 Mono，它将发出单个元素
        Mono.just("Hello")
            .subscribe(System.out::println); // 订阅并打印结果

        // 创建一个 Flux，它将发出多个元素
        Flux.just("World", "Reactor", "Demo")
            .subscribe(System.out::println); // 订阅并打印结果

        // 使用 map 操作符来转换流中的元素
        Flux.just(1, 2, 3)
            .map(i -> "Number: " + i)
            .subscribe(System.out::println);

        // 使用 filter 操作符来过滤流中的元素
        Flux.just(1, 2, 3, 4, 5)
            .filter(i -> i % 2 == 0) // 只保留偶数
            .subscribe(System.out::println);

        // 使用 flatMap 操作符来将流中的每个元素转换为另一个流
        Flux.just("Hello", "World")
            .flatMap(s -> Flux.just(s + "1", s + "2"))
            .subscribe(System.out::println);

        // 使用 delayElements 操作符来延迟流中元素的发出
        Flux.just("Delayed", "Hello", "Reactor")
            .delayElements(Duration.ofSeconds(1)) // 延迟1秒
            .subscribe(System.out::println);

        // 使用 subscribeOn 操作符来指定流的订阅发生在哪个调度器上
        Mono.just("Hello from Scheduler")
            .subscribeOn(Schedulers.parallel()) // 在并行调度器上执行
            .subscribe(System.out::println);
    }
}
